package ch10_thread.thread;

/**
 * 作用、用法：阻塞阶段、唤醒阶段、遇到中断
 * 代码演示：四种情况
 * 特点：
 * 性质：
 * wait主要的作用是线程通信。
 * 让持有该对象锁的线程等待；wait方法则必须放在synchronized块里面；
 * wait还需要额外的方法 notify/notifyAll 进行唤醒，它们同样需要
 * 放在synchronized块里面，且获取对象的锁。
 * 释放CPU的抢用权，同时释放锁
 *
 * @author guodd
 * @version 1.0 use jdk 1.8
 */
public class Wait {
    public static void main(String[] args) {
        Object object = new Object();
        // 线程01
        Thread t1 = new Thread(() -> {
            System.out.println("执行线程：" + Thread.currentThread().getName());
            synchronized (object) {  // 获取monitor锁
                for (int i = 0; i < 20; i++) {
                    System.out.println(i);
                    if (i == 10) {
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        // 线程02
        Thread t2 = new Thread(() -> {
            synchronized (object) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // lock.notify();
                object.notifyAll();
                System.out.println("notify/notifyAll进行唤醒" + Thread.currentThread().getName());
            }
        });

        // 启动，先启动，但是不一定先执行！！！
        // 休眠为了确保t2在t1后面执行
        t1.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }
}
